<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Controllers : CodeIgniter User Guide</title>

<style type='text/css' media='all'>@import url('../userguide.css');</style>
<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' />

<script type="text/javascript" src="../nav/nav.js"></script>
<script type="text/javascript" src="../nav/prototype.lite.js"></script>
<script type="text/javascript" src="../nav/moo.fx.js"></script>
<script type="text/javascript" src="../nav/user_guide_menu.js"></script>

<meta http-equiv='expires' content='-1' />
<meta http-equiv= 'pragma' content='no-cache' />
<meta name='robots' content='all' />
<meta name='author' content='ExpressionEngine Dev Team' />
<meta name='description' content='CodeIgniter User Guide' />

</head>
<body>

<!-- START NAVIGATION -->
<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div>
<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div>
<div id="masthead">
<table cellpadding="0" cellspacing="0" border="0" style="width:100%">
<tr>
<td><h1>CodeIgniter User Guide Version 2.1.0</h1></td>
<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td>
</tr>
</table>
</div>
<!-- END NAVIGATION -->


<!-- START BREADCRUMB -->
<table cellpadding="0" cellspacing="0" border="0" style="width:100%">
<tr>
<td id="breadcrumb">
<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp;
<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp;
Controllers
</td>
<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter-kr.org/user_guide_2.1.0/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td>
</tr>
</table>
<!-- END BREADCRUMB -->

<br clear="all" />


<!-- START CONTENT -->
<div id="content">

<h1>컨트롤러 Controllers</h1>

<p>컨트롤러는 여러분 프로그램의 핵심이라 할수 있습니다. 왜냐하면 Http 요청을 어떻게 처리할지 결정하기 때문입니다. </p>
<p>&nbsp;</p>
<ul>
<li><a href="#what">컨트롤러란 무엇인가?</a></li>
<li><a href="#hello">Hello World</a></li>
<li><a href="#functions">함수들</a></li>
<li><a href="#passinguri">URI Segments를 함수에 전달하기</a></li>
<li><a href="#default">기본 Controller정의</a></li>
<li><a href="#remapping">함수요청을 재 매핑 하기</a></li>
<li><a href="#output">출력데이터 조절</a></li>
<li><a href="#private">Private 함수</a></li>
<li><a href="#subfolders">컨트롤러들을 하위폴더로 구성하기</a></li>
<li><a href="#constructors">클래스 생성자</a></li>
<li><a href="#reserved">예약된 함수명 </a></li>
</ul>


<a name="what"></a>
<h2>컨트롤러란 무엇인가?</h2>

<p><dfn> 간단하게 말하면 컨트롤러는 URL과 상호작용하는 클래스 파일이라고 할수 있습니다.</dfn></p>

<p>아래 URI를 보세요 :</p>

<code>example.com/index.php/<var>blog</var>/</code>

<p>위 예제에서 CodeIgniter 는 <dfn>blog.php</dfn> 라는 파일을 Controller 로서 찾은후 로드 합니다.</p>

<p><strong>컨트롤러의 이름이 URI 의 첫번째 새그먼트와 동일하다면 해당 컨트롤러는 자동적으로 로드될것입니다.</strong></p>

<a name="hello"></a>
<h2>따라해보세요:&nbsp; Hello World!</h2>

<p>실재로 작동되는걸 확인해보는것이 쵝오죠 ! <dfn>blog.php</dfn> 라는 파일을 만든후 다음의 코드를 입력하세요 . </p>


<textarea class="textarea" style="width:100%" cols="50" rows="10">
&lt;?php
class Blog extends CI_Controller {

	public function index()
	{
		echo 'Hello World!';
	}
}
?&gt;
</textarea>



<p>그다음에 <dfn>application/controllers/</dfn> 폴더에 저장하세요 . </p>

<p>자 이제 아래예 처럼 브라우저에서 접속보세요 .(example.com 부분은 여러분의 url 로 대체되어야합니다):</p>

<code>example.com/index.php/<var>blog</var>/</code>

<p> 정상적으로 하셨다면 <samp>Hello World!</samp> 라는 텍스트가 화면에 표시되는걸 보실수 있을거예요.</p>

<p>Note: 클래스명은 반드시 대문자로 시작되어야합니다. 아래의 예제는 맞습니다.:</p>

<code>&lt;?php<br />
class <var>Blog</var> extends CI_Controller {<br />
<br />
}<br />
?&gt;</code>

<p>그러나 아래의 예제는 틀렸습니다. </p>

<code>&lt;?php<br />
class <var>blog</var> extends CI_Controller {<br />
<br />
}<br />
?&gt;</code>

<p>님하가 만드신 컨트롤러는 반드시 <dfn>부모컨트롤러</dfn> 로 부터 상속(extends)받아야합니다.그렇지않으면 컨트롤러의 기능을 사용할 수 없습니다. </p>



<a name="functions"></a>
<h2>함수 (Functions)</h2>

<p>위 예제에서 함수이름은 <dfn>index()</dfn> 였습니다.  "index" 함수는 URI 에서 두번째 새그먼트가 전달되지않을때 기본으로 실행됩니다. 아래와같은 방법으로도 위 예제와같이 "Hello World"를 화면에 뿌릴수 있습니다. </p>

<code>example.com/index.php/<var>blog</var>/<samp>index</samp>/</code>

<p><strong>URI 의 두번째 새그먼트는 컨트롤러 내의 어떤함수가 실행될지를 결정합니다..</strong></p>

<p>따라해보세요. 새로운 함수를 컨트롤러에 추가합니다.</p>


<textarea class="textarea" style="width:100%" cols="50" rows="15">
&lt;?php
class Blog extends CI_Controller {

	public function index()
	{
		echo 'Hello World!';
	}

	public function comments()
	{
		echo 'Look at this!';
	}
}
?&gt;
</textarea>

<p>아래 URL로 접속하여 <dfn>comment</dfn> 함수를 실행시켜봅시다:</p>

<code>example.com/index.php/<var>blog</var>/<samp>comments</samp>/</code>

<p>새로운 메세지가 보이시죠 ? 짝짝짝 </p>

<a name="passinguri"></a>
<h2>URI Segments 를 함수에 전달하기</h2>

<p> URI 가 2개보다 많은 세그먼트를 포함하고있다면 나머지들은 파라미터로 함수에 전달됩니다.</p>

<p>예를들어 다음의 URL 이라면:</p>

<code>example.com/index.php/<var>products</var>/<samp>shoes</samp>/<kbd>sandals</kbd>/<dfn>123</dfn></code>

<p>함수는 새그먼트 3번과 4번("sandals" 및 "123")을 파라미터로 전달받게 됩니다. </p>

<code>
&lt;?php<br />
class Products extends CI_Controller {<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public function shoes($sandals, $id)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo $sandals;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo $id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
?&gt;
</code>

<p class="important"><strong>중요:</strong>&nbsp; 만약 <a href="routing.html">URI 라우팅(Routing)</a> 을 사용하고있다면, 함수에전달된 새그먼트는 재 라우팅된 새그먼트 일것입니다.</p>


<a name="default"></a>
<h2>기본 Controller 정의 </h2>

<p>새그먼트 없이 사이트의 루트 url 만 요청될때 실행될 기본 컨트롤러를 지정할 수 있습니다.</p>
<p>기본 컨트롤러를 지정하려면<dfn>application/config/routes.php</dfn> 파일의 아래 변수에 세팅합니다.</p>
<code>$route['default_controller'] = '<var>Blog</var>';</code>

<p>위와 같이 Blog를 기본 컨트롤러로 지정하면 루트 url 이 요청되었을때 이제는 Hello World를 보실수 있을것입니다.</p>



<a name="remapping"></a>
<h2>함수요청을 재 매핑 하기</h2>

<p>위에서 설명한것처럼, 일반적으로 URI 의 두번째 새그먼트는 컨트롤러내의 어떤 함수를 실행할것인가를 결정합니다. 이런 일반루틴을 재정의하여 원하는 액션으로 바꿀수 있습니다.그러려면<kbd>_remap()</kbd> 함수를 사용합니다. </p>

<code>public function _remap()<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;// Some code here...<br />
}</code>

<p class="important"><strong>Important:</strong>&nbsp; 만약 컨트롤러가 <kbd>_remap()</kbd>함수를 포함하고이다면, URI가 어떻든간에 _remap() 함수를 호출하게될것입니다.왜냐하면 _remap()은 CI 가 정의해 놓은 일반루틴 대신 여러분 자신만의 라우팅방법으로 재정의 해버리기 때문입니다.</p>

<p>재정의된 함수호출(일반적으로 URI의 두번째 새그먼트)은 함수명이 <kbd>_remap()</kbd> 의 파라미터로 전달됩니다:</p>

<code>public function _remap(<var>$method</var>)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;if ($method == 'some_method')<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this->$method();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;else<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this->default_method();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
  }</code>
  <p><kbd>_remap()</kbd> 메서드로 넘기는 메서드이름 외의 파라미터는 모두 옵션입니다. 이 배열은 PHP의 <a href="http://php.net/call_user_func_array">call_user_func_array</a>와
    결합하여, CodeIgniter의 기본동작처럼 작동합니다.</p>

<code>public function _remap($method, $params = array())<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;$method = 'process_'.$method;<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (method_exists($this, $method))<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return call_user_func_array(array($this, $method), $params);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;show_404();<br />
}</code>



<a name="output"></a>
<h2>출력데이터 조절(Processing Output)</h2>

<p>CodeIgniter 는 최종적으로 렌더링되어  자동적으로 브라우저에 데이터를 전송해주는 출력클래스를 가지고있습니다<a href="views.html">. 뷰항목</a> 과 <a href="../libraries/output.html">출력클래스</a> 페이지에서 보다 자세한 정보를 보실수 있습니다.  그러나 어떤경우에는 최종적으로 데이터가 브라우저로 보내지기전에 뭔가 전처리를 해야할때도 있을것입니다.  그것은 컨트롤러에 <dfn>_output() </dfn> 함수를 추가하는 것으로 가능합니다. </p>

  <p><strong>Important:</strong>&nbsp; 컨트롤러가<kbd>_output()</kbd>라는 함수를 가지고있다면
    최종데이터를 바로 전송하는것 대신 그함수가 실행될것입니다.함수의 첫번째 파라미터는 최종출력데이터를 가지고있습니다.</p>

<p>예제:</p>

<code>
public function _output($output)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;echo $output;<br />
  }</code>
  <p class="important">중요 : <dfn>_output()</dfn> 는 최종데이터를 받습니다. 최종데이터가 _output()에
    전달되기전에 벤치마크 및 메모리사용 데이터는 렌더링될것이고,캐시작성이 활성 상태라면 캐시파일도 작성되며, <a href="../libraries/output.html">feature</a>
    항목을 사용한다면 헤더정보도 보내질것입니다. <br />
    컨트롤러가 출력캐시를 정상적으로 보내게 하려면, <dfn>_output()</dfn> 메서드를 아래와 같이 사용하세요:<br />
    <code>if ($this-&gt;output-&gt;cache_expiration &gt; 0)<br />
    {<br />
    &nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;output-&gt;_write_cache($output);<br />
    }</code><br />
    그런데 이 함수를 사용한다면 페이지 실행시간 및 메모리사용상태정보는 정확하지 않을수 있습니다.왜냐하면 그러한 정보들은 당신이 _output()
    에서 처리할 내용이 어떤것인지 계산에 넣고 있지 않기 때문입니다. 출력을 조절하는 다른방법은<a href="../libraries/output.html">출력클래스</a>
    항목에서 찾아보세요.</p>

<a name="private"></a>
<h2>Private 함수 </h2>


<p>때에따라서 함수의 공개적 접근을 허용해서는안될경우도 있을것입니다.  함수를private 으로 만들려면, 간단히 밑줄(_)을 함수이름앞에 추가해주세요.그러면 웹에서 호출할 수 없게 됩니다.</p>
<p>예제:</p>  <code> private function _utility()<br />
  {<br />
  &nbsp;&nbsp;// some code<br />
  }</code>
  <p>아래와 같이 접근하려해도 작동하지않을것입니다:</p>

<code>example.com/index.php/<var>blog</var>/<samp>_utility</samp>/</code>



<a name="subfolders"></a>
<h2>컨트롤러들을 하위폴더로 구성하기</h2>

<p>대형 사이트를 만든다면 아마도 컨트롤러를 하위폴더로 구성하는것이 더 나을것입니다.</p>

<p><dfn>application/controllers</dfn> 아래에 폴더를 만든다음 컨트롤러 클래스들을 그안에 넣으세요.</p>

<p><strong>Note:</strong>&nbsp; 이런식으로 사용하는경우에 URI 첫번째 새그먼트는 반드시 폴더명이라야합니다.</p>
<p>예를들어, 여러분의 컨트롤러 위치가 아래와같다면:</p>
<code>application/controllers/<kbd>products</kbd>/shoes.php</code>

<p>위의 컨트롤러를 호출하기위해서는 아래와같은 URI를 사용해야합니다:</p>

<code>example.com/index.php/products/shoes/show/123</code>

<p>각각의 하위폴더는 URL 에서 하위폴더만을 호출할때를 대비하여 기본 컨트롤러를 가지고 있어야 할것입니다. 간단히 기본컨트롤러를<dfn>application/config/routes.php</dfn> 파일에 설정하시면 됩니다. </p>


<p>또한 CodeIgniter 는 URI 를<a href="routing.html">URI라우팅( Routing)</a> 기능을 이용하여 재 매핑할 수 있도록 지원하고있습니다. </p>


<h2><a name="constructors"></a>클래스 생성자</h2>


<p>컨트롤러에서 생성자를 사용하고자 한다면 생성자아래 반드시 아래의 코드가 들어있어야합니다.:</p>  <code>parent::<font color="#FF0099">__construct</font>();</code>
  <p>그렇지않으면 여러분이 만든 생성자가 부모 controller 의 생성자를 재정의 해버리기때문입니다.</p>
<p>그러므로 반드시 위와같이 부모 controller 를 수동으로 호출해 주어야합니다. </p>  <p>&nbsp;</p>
  <code> &lt;?php<br />
  class <kbd>Blog</kbd> extends CI_Controller {<br />
  <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public function <kbd>__construct()</kbd><br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<var>parent::__construct();</var><br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 생성자 코드에 기능추가<br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
  }<br />
  ?&gt;</code>
  <p>생성자는 클래스가 초기화될때 어떤 기본값들을 설정해야한다거나 어떤 프로세스를 수행해야할때 유용합니다.생성자는 리턴값이 있어서는 안됩니다. </p>

<a name="reserved"></a>
<h2>예약된 함수명</h2>

<p><a href="reserved_names.html">예약어 페이지를 참고해주세요</a></p>

<h2>&nbsp;</h2>

</div>
<!-- END CONTENT -->


<div id="footer">
<p>
Previous Topic:&nbsp;&nbsp;<a href="urls.html">CodeIgniter URLs</a>
&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp;
<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp;
<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp;
Next Topic:&nbsp;&nbsp;<a href="reserved_names.html">Reserved Names</a></p>
<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2011 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">Ellislab, Inc.</a></p>
</div>

</body>
</html>